package 中等.哈希表;

import util.ListNode;

import java.util.HashSet;
import java.util.Set;

/**
 * 给定链表头结点 head，该链表上的每个结点都有一个 唯一的整型值 。
 * 同时给定列表 nums，该列表是上述链表中整型值的一个子集。
 * 返回列表 nums 中组件的个数，这里对组件的定义为：链表中一段最
 * 长连续结点的值（该值必须在列表 nums 中）构成的集合。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/linked-list-components
 */
public class 链表组件_817 {

    public static void main(String[] args) {

    }

    /**
     * 注意：
     * 不是返回链表中的最长组件长度！！！
     * 而是组件的数量！！！
     *
     * @param head
     * @param nums
     * @return
     */
    public int numComponents(ListNode head, int[] nums) {
        int count = 0;
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            set.add(num);
        }

        while (head != null) {
            // 当前节点是否存在列表中
            boolean flag = false;
            while (head != null && set.contains(head.val)) {
                head = head.next;
                flag = true;
            }

            if (flag) count++;
            if (head != null) head = head.next;
        }
        return count;
    }

}
